Program Listing for File tracked_obstacle.h

Return to documentation for file (codes/cubicle_merge/tracked_obstacle.h)

//
// Created by hd on 4/19/18.
//

#ifndef PROJECT_TRACKED_OBSTACLE_H
#define PROJECT_TRACKED_OBSTACLE_H

#include <Eigen/Dense>
#include <utility>
#include "util.h"
#include "kalman.h"
#include "map_element.h"

class TrackedObstacle {
public:
    explicit TrackedObstacle(MapElement* obstacle):
            obstacle_(obstacle), kf_(0, 3, 6)
    {
        fade_out_counter_ = s_fade_counter_size_;
        initKF();
    }

    void predictState() {

        kf_.predictState();

        obstacle_->center_point_world.x() = kf_.q_pred(0);
        obstacle_->velocity.x() = kf_.q_pred(1);

        obstacle_->center_point_world.y() = kf_.q_pred(2);
        obstacle_->velocity.y() = kf_.q_pred(3);

        obstacle_->center_point_world.z() = kf_.q_pred(4);
        obstacle_->velocity.z() = kf_.q_pred(5);

//        obstacle_.height = kf_.q_pred(6);
//        obstacle_.width = kf_.q_pred(7);
        fade_out_counter_--;
    }

    void correctState(const MapElement* new_obstacle) {
        kf_.measure_sig(0) = new_obstacle->center_point_world.x();
        kf_.measure_sig(1) = new_obstacle->center_point_world.y();
        kf_.measure_sig(2) = new_obstacle->center_point_world.z();
//        kf_.measure_sig(3) = new_obstacle.height;
//        kf_.measure_sig(4) = new_obstacle.width;

        kf_.correctState();

        obstacle_->center_point_world.x() = kf_.q_est(0);
        obstacle_->velocity.x() = kf_.q_est(1);

        obstacle_->center_point_world.y() = kf_.q_est(2);
        obstacle_->velocity.y() = kf_.q_est(3);

        obstacle_->center_point_world.z() = kf_.q_est(4);
        obstacle_->velocity.z() = kf_.q_est(5);

//        obstacle_.height = kf_.q_est(6);
//        obstacle_.width = kf_.q_est(7);

        fade_out_counter_ = s_fade_counter_size_;
    }

    void updateState() {
        kf_.predictState();
        kf_.correctState(); // Measurements are frozen

        obstacle_->center_point_world.x() = kf_.q_est(0);
        obstacle_->velocity.x() = kf_.q_est(1);

        obstacle_->center_point_world.y() = kf_.q_est(2);
        obstacle_->velocity.y() = kf_.q_est(3);

        obstacle_->center_point_world.z() = kf_.q_est(4);
        obstacle_->velocity.z() = kf_.q_est(5);

//        obstacle_.height = kf_.q_est(6);
//        obstacle_.width = kf_.q_est(7);

        fade_out_counter_--;
    }

    void setSamplingTime(double tp) {
        s_sampling_time_ = tp;
    }

    void setCounterSize(int size) {
        s_fade_counter_size_ = size;
    }

    void setCovariances(double process_var, double process_rate_var, double measurement_var) {
        s_process_variance_ = process_var;
        s_process_rate_variance_ = process_rate_var;
        s_measurement_variance_ = measurement_var;
    }

    bool hasFaded() const { return fade_out_counter_ <= 0; }
    const MapElement* getObstacle() const { return obstacle_; }
    KalmanFilter getKF() const { return kf_; }

private:

    int fade_in_counter_{};

    int fade_out_counter_;

    int s_fade_counter_size_        = 200;
    double s_sampling_time_         = 0.01;
    double s_process_variance_      = 0.01;
    double s_process_rate_variance_ = 0.1;
    double s_measurement_variance_  = 1.0;

    MapElement* obstacle_;

    KalmanFilter kf_;

    void initKF() {
        kf_.state_m(0, 1) = s_sampling_time_;   //delta_t
        kf_.state_m(2, 3) = s_sampling_time_;
        kf_.state_m(4, 5) = s_sampling_time_;

        kf_.output_m(0, 0) = 1.0;
        kf_.output_m(1, 2) = 1.0;
        kf_.output_m(2, 4) = 1.0;

        kf_.R *= s_measurement_variance_;

        kf_.Q(0, 0) = s_process_variance_;
        kf_.Q(1, 1) = s_process_rate_variance_;
        kf_.Q(2, 2) = s_process_variance_;
        kf_.Q(3, 3) = s_process_rate_variance_;
        kf_.Q(4, 4) = s_process_variance_;
        kf_.Q(5, 5) = s_process_rate_variance_;
//        kf_.Q(6, 6) = s_process_variance_;
//        kf_.Q(7, 7) = s_process_variance_;

        kf_.q_est(0) = kf_.q_pred(0) = obstacle_->center_point_world.x();
        kf_.q_est(1) = kf_.q_pred(1) = obstacle_->velocity.x();
        kf_.q_est(2) = kf_.q_pred(2) = obstacle_->center_point_world.y();
        kf_.q_est(3) = kf_.q_pred(3) = obstacle_->velocity.y();
        kf_.q_est(4) = kf_.q_pred(4) = obstacle_->center_point_world.z();
        kf_.q_est(5) = kf_.q_pred(5) = obstacle_->velocity.z();
//        kf_.q_est(6) = kf_.q_pred(6) = obstacle_.height;
//        kf_.q_est(7) = kf_.q_pred(7) = obstacle_.width;
    }



};


#endif //PROJECT_TRACKED_OBSTACLE_H